chore(generator): delegate request-id setup to public request#17739
chore(generator): delegate request-id setup to public request#17739hebaalazzeh wants to merge 38 commits into
Conversation
There was a problem hiding this comment.
Code Review
This pull request refactors the request ID setup logic in the generated client templates by delegating it to google.api_core.gapic_v1.method_helpers.setup_request_id instead of maintaining an inline implementation. As a result, the redundant unit tests for _setup_request_id have been removed from both the templates and the golden integration tests. There are no review comments, so I have no feedback to provide.
f037044 to
f25d768
Compare
a0bff77 to
613b392
Compare
f25d768 to
71b2f4e
Compare
e02ee4b to
db040bb
Compare
71b2f4e to
a8cc8d8
Compare
|
This implementation makes sense if we plan to bump up the api_core requirement Before merging, we need to:
There's also a chance we will want to keep a fallback implementation to keep supporting old api_core versions |
…lic helpers Introduces method_helpers module containing setup_request_id helper. Exposes the module as public in gapic_v1.
…t and improve docstring
90602cc to
76ac456
Compare
…lic helpers Introduces method_helpers module containing setup_request_id helper. Exposes the module as public in gapic_v1.
Updates generator templates and goldens to import public method_helpers from google-api-core gapic_v1 and call setup_request_id helper. Removes duplicate setup_request_id test logic from generated client unit tests.
…t and improve docstring
8e31d83 to
20adea6
Compare
…centralization-request-id
…centralization-request-id
…lient.py to use setup_request_id
…vent coverage drop in showcase
20e4bea to
a8105ff
Compare
| setattr(request, field_name, request_id_val) | ||
| except (AttributeError, ValueError): | ||
| # Proto-plus messages or other objects | ||
| if not getattr(request, field_name, None): |
There was a problem hiding this comment.
Is this line consistent to what we have in the requests.py in api-core?
| request (Union[google.protobuf.message.Message, dict]): The request object. | ||
| field_name (str): The name of the field to populate. | ||
| is_proto3_optional (bool): Whether the field is proto3 optional. | ||
| """ |
There was a problem hiding this comment.
do we need the check below (similar to what we have in api-core)
if request is None:
return| from google.api_core.client_options import ClientOptions | ||
| from google.api_core import exceptions as core_exceptions | ||
| from google.api_core import gapic_v1 | ||
| {% if has_auto_populated_fields.value %} |
There was a problem hiding this comment.
Why do we only generate this file when has_auto_populated_fields is true?
| except ImportError: # pragma: NO COVER | ||
| # TODO(https://github.com/googleapis/google-cloud-python/issues/17813): Remove this fallback when google-api-core >= 2.26.0 is the minimum required version. | ||
| def setup_request_id(request, field_name: str, is_proto3_optional: bool): # pragma: NO COVER |
There was a problem hiding this comment.
Why do we need these pragma comments?
| request (Union[google.protobuf.message.Message, dict]): The request object. | ||
| field_name (str): The name of the field to populate. | ||
| is_proto3_optional (bool): Whether the field is proto3 optional. | ||
| """ |
There was a problem hiding this comment.
the diff here looks pretty broken
| # See the License for the specific language governing permissions and | ||
| # limitations under the License. | ||
| # | ||
|
|
There was a problem hiding this comment.
we should have a file-level docstring explaining this file
| ) | ||
|
|
||
| self._client._setup_request_id(request, 'request_id', False) | ||
| setup_request_id(request, 'request_id', False) |
There was a problem hiding this comment.
doesn't this need to be imported?
|
|
||
| try: | ||
| from google.api_core.gapic_v1.requests import setup_request_id # type: ignore | ||
| except ImportError: # pragma: NO COVER |
There was a problem hiding this comment.
do we need the NO COVER here? It feels like it could be risky if this code isn't covered. We should have some tests that cover the lower bound for api-core, which would hit this
There was a problem hiding this comment.
I left a similar comment above i.e. we'll probably miss coverage and adding # pragma: NO COVER is not the right way to silence coverage here.
However, I believe _compat.py will only generate static / helper code. Ideally, all the code in here should be identical to what we add to api-core (we should have a strict contract about this somewhere in the file). Given that, generating these tests don't really provide any value (if these tests are already well tested in api-core).
So it shouldn't be risky.
…_core requests.py
4659080 to
e243bbd
Compare
| if not opts.metadata and template_name.endswith("gapic_metadata.json.j2"): | ||
| return answer | ||
|
|
||
| # Only render _compat.py.j2 if the API schema has auto_populated_fields |
There was a problem hiding this comment.
Can you explain this a bit more? What are auto_populated_fields?
Updates generator templates and goldens to import public
requestsfromgoogle-api-coregapic_v1and callsetup_request_idhelper. Removes duplicatesetup_request_idtest logic from generated client unit tests.Temporarily pointing to this PR then will revert once it is merged/released: